package com.atguigu.liskov.improve;

/**
 * 里氏替换原则 优化代码
 */
public class Liskov {
    public static void main(String[] args) {
        A a = new A();
        System.out.println("11-3=" + a.fun1(11, 3));
        System.out.println("1-8=" + a.fun1(1, 8));
        System.out.println("========================");
        // B类不再继承A类,因此调用者不会再错误调用A类的方法
        B b = new B();
        System.out.println("11-3=" + b.fun3(11, 3));
        System.out.println("1-8=" + b.fun3(1, 8));
        System.out.println("11+3+9=" + b.fun2(11, 3));
    }
}

/**
 * 创建一个更加基础的基类
 */
class Base {
    // 更基础的方法和成员写到Base类
}

/**
 * A类继承Base
 */
class A extends Base {
    public int fun1(int num1, int num2) {
        return num1 - num2;
    }
}

/**
 * B类继承Base
 * 增加了一个新方法, 把两个数相加 ,然后和9求和
 */
class B extends Base {
    // 如果B类需要使用A类的方法, 可以采用组合的方法
    private final A a = new A();

    /**
     * 此时可以之类使用a类方法
     *
     * @param num1 parm1
     * @param num2 parm2
     * @return parm1 - parm2 + 9
     */
    public int fun2(int num1, int num2) {
        return a.fun1(num1, num2) + 9;
    }

    /**
     * 此时可以之类使用a类方法
     *
     * @param num1 parm1
     * @param num2 parm2
     * @return parm1 - parm2 + 9
     */
    public int fun3(int num1, int num2) {
        return this.a.fun1(num1, num2);
    }
}
